package cn.xioabai.common.utility;

import cn.xioabai.common.constant.JsonStrConstant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.Objects;

/**
 * json 文件操作工具
 *
 * @Author yangdaji
 * @Date 2022/10/14 0014
 * @PackageName cn.xioabai.utils
 * @ClassName JsonFileUtils
 */
public class JsonFileUtils {

    private static Logger log = LoggerFactory.getLogger(JsonFileUtils.class);

    /**
     * 读取指定文件, 在jar包中可进行外部文件读取, 可作额外的配置读取操作
     *
     * @param filePath 文件路径
     * @param source   应用资源,来源 org.springframework.boot.system.ApplicationHome
     * @return
     */
    public static String readConfig(String filePath, File source) {
        //判断是否是jar包 , jar包中获取为空, 非jar 不为空
        if (Objects.isNull(source)) {
            log.info("非jar包配置路径: {}", filePath);
            return readCodeConfigFile(filePath);
        } else {
            String jarPath = source.getPath();
            if (jarPath.endsWith(".jar")) {
                log.info("[jar包]-jar包配置路径: {}", filePath);
                return readConfigFile(filePath);
            } else {
                log.info("未识别到 .jar 文件");
            }
        }
        return null;
    }

    /**
     * 读取指定文件, 在jar包中可进行外部文件读取, 可作额外的配置读取操作
     *
     * @param filePath 文件路径
     * @return
     */
    public static String readConfig(String filePath) {
        if (SprintBootJarUtils.currentEnvIsJar()) {
            log.info("[jar包]-jar包配置路径: {}", filePath);
            return readConfigFile(filePath);
        } else {
            log.info("非jar包配置路径: {}", filePath);
            return readCodeConfigFile(filePath);
        }
    }

    /**
     * 读取自定义目录下配置
     *
     * @param filename 文件名称
     * @return
     * @throws IOException
     */
    public static String readConfigFile(String filename) {
        filename = filename.replace("\\", "/");
        try (InputStream fileInputStream = new FileInputStream(filename)) {
            return fileRead(fileInputStream);
        } catch (IOException e) {
            log.error("文件流异常: {}", e.getMessage());
            return null;
        }
    }


    /**
     * 读取类路径 resource 下配置
     *
     * @param classLoaderInputStream 类路径输入流
     * @return
     */
    public static String readCodeConfigFile(InputStream classLoaderInputStream) {
        if (Objects.nonNull(classLoaderInputStream)) {
            return fileRead(classLoaderInputStream);
        } else {
            return null;
        }
    }

    /**
     * 读取类路径 resource 下配置
     *
     * @param fileName 文件名称
     * @return
     */
    public static String readCodeConfigFile(String fileName) {
        InputStream classLoaderInputStream = ClassLoaderPathResourceUtils.getClassLoaderInputStream(fileName);
        if (Objects.nonNull(classLoaderInputStream)) {
            return fileRead(classLoaderInputStream);
        } else {
            return null;
        }
    }


    /**
     * 编译文件读取
     *
     * @param inputStream 输入流
     * @return
     */
    public static String fileRead(InputStream inputStream) {
        try (Reader reader = new InputStreamReader(inputStream);
             BufferedReader br = new BufferedReader(reader)) {
            StringBuilder stringBuffer = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                stringBuffer.append(line);
                stringBuffer.append("\n");
            }
            String jsonStr = stringBuffer.toString().trim();
            if (jsonStr.startsWith(JsonStrConstant.LEFT_CURLY_BRACES) &&
                    jsonStr.endsWith(JsonStrConstant.RIGHT_CURLY_BRACES)) {
                return jsonStr;
            }
            return null;
        } catch (Exception e) {
            log.error("文件读取出错: {}", e.getMessage());
            return null;
        }
    }

}
